﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BusinessLogic.Security;
using System.Web.Mvc;

namespace RusIS.CMS.Security
{
    public class MySecurityFilter : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            #region // Проверка стоит ли у Action атрибута "Разрешен анонимным пользователям". Если ДА - не делается дальнейшая проверка.
            
            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(
                    typeof(AllowAnonymousAttribute), inherit: true)
                || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                    typeof(AllowAnonymousAttribute), inherit: true);

            if (skipAuthorization)
                return;

            #endregion // Проверка стоит ли у Action атрибута "Разрешен анонимным пользователям". Если ДА - не делается дальнейшая проверка.

            var manager = new MySecurityManager();
            var user = BusinessLogic.Security.UserPrincipal.Current;
            
            var action = (string)filterContext.RouteData.Values["action"]; // Действие (метод контроллера)
            var id = (string)filterContext.RouteData.Values["id"]; // id (параметр, следующий за названием действия)
            var controllerType = filterContext.Controller.GetType(); // Контроллер

            // Проверка прав доступа. MySecurityManager примет на вход пользователя и параметры action, id, controller
            // и выполнит проверку доступности действия текущему пользователю
            if (!manager.IsGrantAction(user, controllerType, action))
            {
                //filterContext.Result = new HttpUnauthorizedResult();
                throw new HttpException(403, "Доступ запрещен");
            }

        }
    }
}